package com.atxiaodei.rabbitmq.simple;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @ClassName Comsumer
 * @Deacription TODO
 * @Author 诸葛孔暗
 * @Date 2021/3/22 14:04
 * @Version 1.0
 **/
public class Consumer {
    public static void main(String[] args) {
        // 所有的中间件技术都是基于tcp/ip 协议基础上构建新型的协议规范，只不过rabbitmq遵循的是amqp协议

        // ip port

        // 1、创建连接工程
        ConnectionFactory connectionFactory=new ConnectionFactory();

        connectionFactory.setHost("172.20.10.4");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");

        Connection connection=null;
        Channel channel =null;
        try {
            // 2、创建连接Connection
            connection = connectionFactory.newConnection("消息生产者");
            // 3、通过连接获取通道Channel
            channel = connection.createChannel();
            // 4、通过通道创建交换机，声明队列，绑定关系，路由key，发送消息和接收消息
            String queueName="queue1";

            channel.basicConsume("queue1", true, new DeliverCallback() {
                @Override
                public void handle(String s, Delivery delivery) throws IOException {
                    System.out.println("收到的消息是"+new String(delivery.getBody(),"UTF-8"));
                }
            }, new CancelCallback() {
                @Override
                public void handle(String s) throws IOException {
                    System.out.println("接收消息失败！");
                }
            });

            System.out.println("接收消息成功！");
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("消息接收异常！");
        }finally {
            // 7、关闭通道
            if (channel !=null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 8、关闭连接
            if (connection !=null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
